package org.esgi.ppa.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.swing.table.AbstractTableModel;


public class TestManager extends AbstractTableModel implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 4194379296326840207L;
	public static List<UnitTest> tests = new ArrayList<UnitTest>();
	private final String[] entetes = {"Position", "URL", "M�thode", "Requetes", "Connexions"};
	private  HashMap<String,String> ErreurResponse=new HashMap<String, String>();
	public TestManager(){ 
		super();
		initErreur();
	}
	public void initErreur(){
		this.ErreurResponse.put("200", "Tout s’est bien passé le document est ci-après.");
		this.ErreurResponse.put("204", "Le browser continue à afficher l’ancienne page.");
		this.ErreurResponse.put("301", "Le document demandé a été déplacé ailleurs définitivement (l’endroit est indiqué dans le header Location). Les browsers y vont automatiquement.");
		this.ErreurResponse.put("302", "Le document demandé a été déplacé ailleurs temporairement (l’endroit est indiqué dans le header Location). Les browsers y vont automatiquement. ");
		this.ErreurResponse.put("401", " Le browser essaye d’accéder à une page protégée par mot de passe et il n’y a pas de header Authorization dans la requête. Le Serveur Web ouvre une fenêtre de login dans le browser et réitère la demande avec le Header Authorization mis aux valeurs entrées.");
		this.ErreurResponse.put("403", "Le browser essaie d’accéder à une directory et le serveur a été configuré pour le refuser.");
		this.ErreurResponse.put("404", "Cette page n’existe pas.");
		this.ErreurResponse.put("408", " La page n’a pu être obtenue avant le timeout.");
		this.ErreurResponse.put("400 +", " erreur due au client");
		this.ErreurResponse.put("500 +", " erreur coté serveur.");
		this.ErreurResponse.put("100 a 199", " informatif; le client doit répondre par une autre action.");
	}
	@Override
	public int getColumnCount() {
		return entetes.length;
	}

	@Override
	public int getRowCount() {
		return tests.size();
	}
	
	public String getColumnName(int c){
		  return this.entetes[c];
	}


	@Override
	public Object getValueAt(int r, int c) {
		switch(c){
		case 0 : return tests.get(r).getID();
		case 1 : return tests.get(r).getUrl();
		case 2 : return tests.get(r).getMethod();
		case 3 : return tests.get(r).getRequests();
		case 4 : return tests.get(r).getConnexions();
		default : return null;
		}
	}
	
	public void addTest(UnitTest test){
		tests.add(test);
		System.out.println("----------------");
        for(UnitTest c : tests){
        	System.out.println(c.getUrl());
        }
        System.out.println("----------------");
	}
	
	public int getNextId(){
		return tests.size() + 1;
	}
	
	public void removeRow(int index){
		tests.remove(index);
	}

	public void moveRow(int a, int b) {
		System.out.println("a = "+a+" / b = "+b);
		UnitTest aux;
//		if(2 == a-b || -2 == a-b){
//			System.out.println("ECHANGE");
//			aux = tests.get(a);
//			tests.set(a, tests.get(b));
//			tests.set(b, aux);
//		}else {
			if(a<b){
	        	aux = tests.get(a);
	        	while(a < b){
	        		tests.set(a, tests.get(a+1));
	        		a++;
	        	}
	        	tests.set(b,aux);
	        } else{
	        	aux = tests.get(a);
	        	while(a>b){
	        		tests.set(a,tests.get(a-1));
	        		a--;
	        	}
	        	tests.set(b,aux);
	        }
		//}
      
        System.out.println("-----------");
        for(UnitTest c : tests)
        	System.out.println(c.getUrl());
        System.out.println("-----------");
        fireTableRowsInserted(0, tests.size()-1);
    }
	
	public void save(File f){
		try{
			FileOutputStream saveFile = new FileOutputStream(f.getAbsolutePath());
			ObjectOutputStream oos = new ObjectOutputStream(saveFile);
			List<UnitTest> toSave = tests;
			oos.writeObject(toSave);
			oos.flush();
			oos.close();
		} catch(Exception e){
			e.printStackTrace();
		}
	}
	@SuppressWarnings("unchecked")
	public void open(File f){
		@SuppressWarnings("unused")
		FileInputStream fileToOpen;
		try {
			List<UnitTest> newTests = new ArrayList<UnitTest>();
			FileInputStream fis = new FileInputStream(f);
		    ObjectInputStream o = new ObjectInputStream(fis);
		    newTests = (List<UnitTest>)o.readObject();
		    o.close();
		    tests = newTests;
		    fireTableRowsInserted(0, tests.size()-1);
		} catch (FileNotFoundException e) {
			System.out.println("File Not Found");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("Pb Object Input");
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			System.out.println("Mauvaise conversion");
			e.printStackTrace();
		}
	    

	}
}
